package com.chiyou.common.utils;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import redis.clients.jedis.Jedis;


/**
 * redis对set的操作key-val
 * @author 陈嘉瑛
 * @version 2015-11-18
 */
public class RedisUtilStr extends RedisBase{
	private static Log logger = LogFactory.getLog(RedisUtilStr.class);
	
	/**
	 * 设置一堆key-val到redis中
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key
	 * @param val
	 * @param inactiveTime
	 * @return
	 */
	public Boolean set(Object key, Object val, Integer inactiveTime){
		return set(SerializeUtil.serialize(key), SerializeUtil.serialize(val), inactiveTime);
	}

	/**
	 * 设置一堆key-val到redis中
	 * key和val需要序列化
	 * 作者：陈嘉瑛
	 * 时间：2015-11-181
	 * @param key
	 * @param val
	 * @param inactiveTime
	 * @return
	 */
	public Boolean set(byte[] key, byte[] val, Integer inactiveTime){
		Jedis jedis = super.getJedis();
		try{
			String rs = jedis.set(key, val);
			if(inactiveTime != null && inactiveTime != 0){
				super.expire(key, inactiveTime);
			}
			if("ok".equalsIgnoreCase(rs))return true;
		}catch(Exception e){
			logger.debug(e.getMessage());
		}finally{
			super.returnPool(jedis);
		}
		return false;
	}
	
	/**
	 * 获取指定key的值
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key
	 * @return
	 */
	public Object get(Object key){
		return get(SerializeUtil.serialize(key));
	}

	/**
	 * 获取指定key的值
	 * key需要序列化
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key
	 * @return
	 */
	public Object get(byte[] key){
		Jedis jedis = super.getJedis();
		try{
			Object obj = SerializeUtil.unserialize(jedis.get(key));
			return obj;
		}catch(Exception e){
			logger.debug(e.getMessage());
		}finally{
			super.returnPool(jedis);
		}
		return new Object();
	}
	
	/**
	 * 获取一组key对应的值
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param keys
	 * @return
	 */
	public List<Object> mget(Object...keys){
		byte[][] b = new byte[keys.length][];
		int i = 0;
		for(Object key : keys){
			b[i] = SerializeUtil.serialize(key);
			i ++;
		}
		return mget(b);
	}

	/**
	 * 获取一组key对应的值
	 * key需要序列化
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param keys
	 * @return
	 */
	public List<Object> mget(byte[]...keys){
		Jedis jedis = super.getJedis();
		try{
			List<byte[]> ls = jedis.mget(keys);
			List<Object> rs = new ArrayList<Object>();
			for(byte[] b : ls){
				rs.add(SerializeUtil.unserialize(b));
			}
			return rs;
		}catch(Exception e){
			logger.debug(e.getMessage());
		}finally{
			super.returnPool(jedis);
		}
		return new ArrayList<Object>();
	}

	/**
	 * 在指定key对应的值后面拼接数据
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key
	 * @param appendVal
	 * @return
	 */
	public Boolean append(Object key, Object appendVal){
		return append(SerializeUtil.serialize(key), SerializeUtil.serialize(appendVal));
	}

	/**
	 * 在指定key对应的值后面拼接数据
	 * key 和 appendval需要序列化
	 * 作者：陈嘉瑛
	 * 时间：2015-11-18
	 * @param key
	 * @param appendVal
	 * @return
	 */
	private Boolean append(byte[] key, byte[] appendVal) {
		Jedis jedis = super.getJedis();
		try{
			Long lastNum = jedis.strlen(key);
			Long nowNum = jedis.append(key, appendVal);
			if(nowNum - lastNum > 0) return true;
		}catch(Exception e){
			logger.debug(e.getMessage());
		}finally{
			super.returnPool(jedis);
		}
		return false;
	}
}
